package com.example.watertest;



import java.io.IOException;

import org.andengine.audio.music.Music;
import org.andengine.audio.music.MusicFactory;
import org.andengine.audio.sound.Sound;
import org.andengine.audio.sound.SoundFactory;
import org.andengine.engine.Engine;
import org.andengine.engine.FixedStepEngine;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.handler.physics.PhysicsHandler;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.WakeLockOptions;
import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
import org.andengine.entity.IEntity;
import org.andengine.entity.modifier.IEntityModifier;
import org.andengine.entity.modifier.IEntityModifier.IEntityModifierListener;
import org.andengine.entity.modifier.IEntityModifier.IEntityModifierMatcher;
import org.andengine.entity.modifier.JumpModifier;
import org.andengine.entity.modifier.LoopEntityModifier;
import org.andengine.entity.modifier.ScaleModifier;
import org.andengine.entity.modifier.SequenceEntityModifier;
import org.andengine.entity.primitive.Rectangle;
import org.andengine.entity.scene.IOnSceneTouchListener;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.sprite.AnimatedSprite;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.text.Text;
import org.andengine.extension.physics.box2d.FixedStepPhysicsWorld;
import org.andengine.extension.physics.box2d.PhysicsConnector;
import org.andengine.extension.physics.box2d.PhysicsFactory;
import org.andengine.extension.physics.box2d.PhysicsWorld;
import org.andengine.extension.physics.box2d.util.Vector2Pool;
import org.andengine.extension.physics.box2d.util.constants.PhysicsConstants;
import org.andengine.input.sensor.acceleration.AccelerationData;
import org.andengine.input.sensor.acceleration.IAccelerationListener;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.font.Font;
import org.andengine.opengl.font.FontFactory;
import org.andengine.opengl.texture.ITexture;
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.texture.region.ITiledTextureRegion;
import org.andengine.opengl.util.GLState;
import org.andengine.ui.activity.BaseGameActivity;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.adt.color.Color;
import org.andengine.util.modifier.IModifier;

import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;

import android.hardware.SensorManager;
import android.util.Log;




public class PhysicsApplicationIII extends BaseGameActivity implements IOnSceneTouchListener {

	 public static int cameraWidth = 800;
	  public static int cameraHeight = 800;
	  public Scene mScene;
	  public FixedStepPhysicsWorld mPhysicsWorld;
	  private int mBodyCount = 0;
	  public static final short CATEGORYBIT_DEFAULT = 1;
	  public static final short CATEGORYBIT_RED_BOX = 2;
	  public static final short CATEGORYBIT_GREEN_BOX = 4;
	  public static final short MASKBITS_RED_BOX = CATEGORYBIT_DEFAULT + CATEGORYBIT_RED_BOX;
	  public static final short MASKBITS_GREEN_BOX = CATEGORYBIT_DEFAULT + CATEGORYBIT_GREEN_BOX;
	  public static final FixtureDef RED_BOX_FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f, false, CATEGORYBIT_RED_BOX, MASKBITS_RED_BOX, (short)0);
	  public static final FixtureDef GREEN_BOX_FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f, false, CATEGORYBIT_GREEN_BOX, MASKBITS_GREEN_BOX, (short)0); 
	
	  @Override
	  public Engine onCreateEngine(final EngineOptions
	      pEngineOptions) {
	    return new FixedStepEngine(pEngineOptions, 60);
	  }

	  @Override
	  public EngineOptions onCreateEngineOptions() {
	    EngineOptions engineOptions = new EngineOptions(true,
	      ScreenOrientation.LANDSCAPE_SENSOR, new
	        FillResolutionPolicy(), new Camera(0,
	          0, cameraWidth, cameraHeight));
	    engineOptions.getRenderOptions().setDithering(true);
	    engineOptions.getRenderOptions().
	      getConfigChooserOptions()
	        .setRequestedMultiSampling(true);
	    engineOptions.setWakeLockOptions(
	      WakeLockOptions.SCREEN_ON);
	    return engineOptions;
	  }

	  @Override
	  public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback) {
	    pOnCreateResourcesCallback.
	      onCreateResourcesFinished();
	  }

	  @Override
	  public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback) {
	    mScene = new Scene();
	    mScene.setBackground(new Background(0.9f,0.9f,0.9f));
	    pOnCreateSceneCallback.onCreateSceneFinished(mScene);
	
	  }
	  
	  
	  @Override
	  public void onPopulateScene(Scene pScene, OnPopulateSceneCallback pOnPopulateSceneCallback) {
		  
		    mPhysicsWorld = new FixedStepPhysicsWorld(60, new
		    	      Vector2(0f,-SensorManager.GRAVITY_EARTH*2),
		    	        false, 8, 3);
	  		mScene.registerUpdateHandler(mPhysicsWorld);
		  Rectangle nonbouncyBoxRect = new Rectangle(0f, 100f, 100f, 100f,
				  this.getEngine().getVertexBufferObjectManager());
				nonbouncyBoxRect.setColor(0f, 0f, 0f);
				nonbouncyBoxRect.setAnchorCenter(((nonbouncyBoxRect.getWidth() / 2) -
				  nonbouncyBoxRect.getX()) / nonbouncyBoxRect.getWidth(),
				    ((nonbouncyBoxRect.getHeight() / 2) - nonbouncyBoxRect.getY()) /
				        nonbouncyBoxRect.getHeight());
				mScene.attachChild(nonbouncyBoxRect);
				Rectangle bouncyBoxRect = new Rectangle(0f, 40f, 90f, 10f,
				  this.getEngine().getVertexBufferObjectManager());
				bouncyBoxRect.setColor(0f, 0.75f, 0f);
				bouncyBoxRect.setAnchorCenter(((bouncyBoxRect.getWidth() / 2) - bouncyBoxRect.getX()) / bouncyBoxRect.getWidth(),
				    ((bouncyBoxRect.getHeight() / 2) - bouncyBoxRect.getY()) /
				        bouncyBoxRect.getHeight());
				mScene.attachChild(bouncyBoxRect);
				
				
				
				Body multiFixtureBody = mPhysicsWorld.createBody(new BodyDef());
				multiFixtureBody.setType(BodyType.DynamicBody);

				FixtureDef nonbouncyBoxFixtureDef =   PhysicsFactory.createFixtureDef(20, 0.0f, 0.5f);
				final PolygonShape nonbouncyBoxShape = new PolygonShape();
				nonbouncyBoxShape.setAsBox((nonbouncyBoxRect.getWidth() / 2f) /
				  PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT,
				    (nonbouncyBoxRect.getHeight() / 2f) /
				      PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT, 
				        new Vector2(nonbouncyBoxRect.getX() /
				      PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT,
				          nonbouncyBoxRect.getY() /
				      PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT), 0f);
				nonbouncyBoxFixtureDef.shape = nonbouncyBoxShape;
				multiFixtureBody.createFixture(nonbouncyBoxFixtureDef);
				mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(
				  nonbouncyBoxRect, multiFixtureBody));

				FixtureDef bouncyBoxFixtureDef = 
				  PhysicsFactory.createFixtureDef(20, 	1f, 0.5f);
				final PolygonShape bouncyBoxShape = new PolygonShape();
				bouncyBoxShape.setAsBox((bouncyBoxRect.getWidth() / 2f) /
				  PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT,
				    (bouncyBoxRect.getHeight() / 2f) /
				      PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT, 
				        new Vector2(bouncyBoxRect.getX() /
				      PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT,
				          bouncyBoxRect.getY() /
				      PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT), 0f);
				bouncyBoxFixtureDef.shape = bouncyBoxShape;
				multiFixtureBody.createFixture(bouncyBoxFixtureDef);
				mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(
				  bouncyBoxRect, multiFixtureBody));
				
				multiFixtureBody.setTransform(400f /
						  PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT, 240f /
						    PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT, 0f);
				
				
				
		  
		  mScene.setOnSceneTouchListener(this);
		  pOnPopulateSceneCallback.onPopulateSceneFinished();
				
	  }

	  @Override
	  public boolean onSceneTouchEvent(Scene pScene, TouchEvent
	      pSceneTouchEvent) {
		 
	    return true;
	  }

	
		
	
	
}
